package cn.siriusbot.siriuspro.bot.api.impl.bot;

import cn.siriusbot.siriuspro.bot.BotApi;
import cn.siriusbot.siriuspro.bot.api.SiriusUtils;
import cn.siriusbot.siriuspro.bot.api.pojo.User;
import cn.siriusbot.siriuspro.bot.api.tuple.Tuple;
import lombok.NonNull;
import org.springframework.util.ObjectUtils;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 天狼星工具类
 */

public class SiriusUtilsImpl implements SiriusUtils {

    BotApi botApi;

    public SiriusUtilsImpl(BotApi botApi) {
        this.botApi = botApi;
    }

    private final Map<String, User> botUsers = new ConcurrentHashMap<>();

    /**
     * 匹配指令
     *
     * @param botId   机器人ID
     * @param content 消息内容
     * @param cmd     指令前缀
     * @param re      正则
     * @param params  参数值
     * @return 0 未匹配 1 已匹配 2 匹配指令但未匹配正则
     */
    public MatchState matchCmd(String botId, String content, String cmd, String re, @NonNull List<String> params) {
        if (ObjectUtils.isEmpty(content)) return MatchState.NOT_PASS;
        User botUser = botUsers.get(botId);
        if (botUser == null) {
            // 获取机器人信息
            Tuple<User, String> robotInfo = botApi.userApi().getRobotInfo(botId);
            if (robotInfo != null && robotInfo.getFirst() != null) {
                botUser = robotInfo.getFirst();
                botUsers.put(botId, botUser);
            }
        }
        if (botUser != null) {
            // 替换艾特机器人
            content = content.replaceFirst(String.format("<@!%s>", botUser.getId()), "");
        }
        content = content.trim();   // 去收尾空格
        if (content.length() == 0) {
            return MatchState.NOT_PASS;
        }
        if (content.charAt(0) == '/') {
            content = content.substring(1);
        }
        if (content.length() < cmd.length()) {
            return MatchState.NOT_PASS;
        }
        if (!cmd.equals(content.substring(0, cmd.length()))) {
            return MatchState.NOT_PASS;
        }
        Pattern r = Pattern.compile(re);
        Matcher m = r.matcher(content);
        if (m.find()) {
            params.clear();
            for (int i = 1; i <= m.groupCount(); i++) {
                params.add(m.group(i));
            }
            return MatchState.PASS;
        }
        // 未通过正则
        return MatchState.NOT_PASS_RE;
    }

    public String at(User user) {
        return String.format("<@!%s>", user.getId());
    }

    public String at(String userId) {
        return String.format("<@!%s>", userId);
    }
}
